1 Gas Station Data Interactive Map

GasStation <- na.omit(read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/POC.csv"))
rs.gs <- GasStation[sample(nrow(GasStation), size=500), ]
###
g <- list(      scope = 'usa',
           projection = list(type = 'albers usa'),
             showland = TRUE,
            landcolor = toRGB("gray95"),
         subunitcolor = toRGB("gray85"),
         countrycolor = toRGB("gray85"),
         countrywidth = 0.5,
         subunitwidth = 0.5
       )
###
gs.map <- plot_geo(rs.gs, lat = ~ycoord, lon = ~xcoord) %>% 
  add_markers(text = ~paste(paste("State:", STATE), 
                            paste("County:", county), 
                            paste("Address:", ADDRESS), 
                            paste("Zip Code:", ZIPnew), 
                            sep = "<br>"),
              color = ~description, 
              symbol = "circle", 
              hoverinfo = "text")   %>% 
  #colorbar(title = "Incoming flights<br>2011.2")  %>% 
  layout( title = 'Gas Stations in the United States', 
          geo = g)
gs.map

A plotly interactive scatter map was created to plot locations of sampled gas stations across the United States. It seems that a great number of the gas stations in the sample and overall population come from eastern Texas, the coasts of California, and Florida. More gas stations sampled across the U.S. are in the eastern half of the country compared to the western half. It should also be said that the U.S. states in the far northern and mid-western (Utah, Nebraska, Colorado, Wyoming) regions of the country have few to no gas stations that were sampled. This may imply there are not as many gas stations in the northern and mid-western states as in other states. This could be because human population sizes in those states are smaller compared to states with more gas stations. The number of gas stations in a state coud be proportional to population size of that state. As population size increases in a state, so do the number of gas stations. Gas stations sampled along the western and upper eastern coasts of the U.S. tended to all be from urban settings. The few gas stations sampled in the northern states appear to be in rural settings.

2 Philly 2023 Crime Data Interactive Map

PhillyCrime <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/PhillyCrimeSince2015.csv")
PhillyCrime$date <- as.POSIXct(PhillyCrime$date, format = "%m/%d/%Y %H:%M")
PhillyCrime$year <- format(PhillyCrime$date, format="%Y")
crime.2023 <- PhillyCrime %>%
  filter(year == "2023")
crime.2023 <- na.omit(crime.2023)
###
title <- tags$div(
  HTML('<font color = "chocolate" size =4><b>Philadelphia Crime Case Locations 2023</b></font>')
  )
AnnotateWrapper <- tags$div(
   HTML('<center><img border="0" alt="ImageTitle" src="https://raw.githubusercontent.com/azheneghan/aheneghan/main/images/philadelphia.png" width="150" height="100"><center>
    <font color = "darkgreen">2023</font>')
 )
fatalColor <- rep("#DC267F")
fatalColor[which(crime.2023$fatal=="Nonfatal")] <- "#648FFF"
fatalColor[which(crime.2023$fatal=="Fatal")] <- "#DC267F"
##
label.msg <- paste(paste("Street:", crime.2023$street_name),
                   paste("<br> ZIP Code:", crime.2023$zip_code),
                   paste("<br> Neighborhood:", crime.2023$neighborhood),
                   paste("<br> Longitude:", crime.2023$lng),
                   paste("<br> Latitude:", crime.2023$lat))
##
leaflet(crime.2023) %>%
  addTiles() %>% 
  setView(lng=mean(crime.2023$lng), lat=mean(crime.2023$lat), zoom = 13) %>%
  addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
  addCircleMarkers(
            ~lng, 
            ~lat,
            color = fatalColor,
            stroke = FALSE, 
            fillOpacity = 0.4,
            popup = ~label.msg,
            label = ~paste("Street:", crime.2023$street_name))  %>%
  addLegend(position = "bottomright", 
            colors = c("#DC267F", "#648FFF"),
            labels= c("Fatal", "Non-Fatal"),
            title= "Crime Status",
            opacity = 0.4) %>%
  addControl(title, position = "topright") %>%
  addControl(AnnotateWrapper, position = "bottomleft")

An interactive leaflet map was created to plot locations of crimes that took place in Philadelphia, PA in 2023. Crimes were marked with different colors to represent crimes that were fatal and crimes that weren’t. Other relevant location information for each crime in 2023, such as the street and neighborhood where they were, is included in a popup (click each point).

Most of the points themselves appear to be mainly in two large clusters on either side of the river while the others are lower down the river or even more right of the cluster on the right side of the river. There does not appear to be too much variation or any obvious patterns in spread of fatal and non-fatal crimes across Philadelphia in 2023. Most of the fatal and non-fatal crime locations seem to be relatively close to one another. Some points, whether fatal or non-fatal, tend to overlap since some crimes have more than one victim or criminal. Non-fatal crimes seem to be more frequent compared to fatal crimes, and only a few non-fatal crimes tend to stretch out past the aforementioned clusters.

LS0tDQp0aXRsZTogIkdhcyBTdGF0aW9uIGFuZCBQaGlsbHkgMjAyMyBDcmltZSBEYXRhIEludGVyYWN0aXZlIE1hcHMiDQphdXRob3I6ICJBbmRyZXcgSGVuZWdoYW4iDQpkYXRlOiAiMy8yMC8yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogVGl0bGUgZm9udHMgKi8NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCg0KaDQuYXV0aG9yIHsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7DQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQovKiBTZWN0aW9uIGhlYWRlcnMgKi8NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsNCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBEZWNvcmF0aW9uIG9mIGh5cGVybGlua3MgICovDQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IHB1cnBsZTsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgICAjIEluc3RhbGwgUkN1cmwgcGFja2FnZQ0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmlmICghcmVxdWlyZSgibWFwcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFwcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJtYXBzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJodG1sdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiaHRtbHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHdpZGdldHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImh0bWx3aWRnZXRzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx3aWRnZXRzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxlZ2VuZCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxlZ2VuZCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGVnZW5kIikNCn0NCmlmICghcmVxdWlyZSgiZ2VvanNvbmlvIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZW9qc29uaW8iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2VvanNvbmlvIikNCn0NCmlmICghcmVxdWlyZSgic3RyaW5naSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5naSIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzdHJpbmdpIikNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiUkNvbG9yQnJld2VyIikNCn0NCmlmICghcmVxdWlyZSgidGlncmlzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWdyaXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidGlncmlzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmVtIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmZW0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmVtIikNCn0NCmlmICghcmVxdWlyZSgidG1hcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ0bWFwIikNCn0NCmlmICghcmVxdWlyZSgidG1hcHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0bWFwdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgid2Vic2hvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIndlYnNob3QyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIndlYnNob3QyIikNCn0NCmlmICghcmVxdWlyZSgic2YiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInNmIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInNmIikNCn0NCmlmICghcmVxdWlyZSgidGVycmEiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRlcnJhIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRlcnJhIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCg0KIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQojIEdhcyBTdGF0aW9uIERhdGEgSW50ZXJhY3RpdmUgTWFwDQoNCmBgYHtyfQ0KR2FzU3RhdGlvbiA8LSBuYS5vbWl0KHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvUE9DLmNzdiIpKQ0KcnMuZ3MgPC0gR2FzU3RhdGlvbltzYW1wbGUobnJvdyhHYXNTdGF0aW9uKSwgc2l6ZT01MDApLCBdDQojIyMNCmcgPC0gbGlzdCggICAgICBzY29wZSA9ICd1c2EnLA0KICAgICAgICAgICBwcm9qZWN0aW9uID0gbGlzdCh0eXBlID0gJ2FsYmVycyB1c2EnKSwNCiAgICAgICAgICAgICBzaG93bGFuZCA9IFRSVUUsDQogICAgICAgICAgICBsYW5kY29sb3IgPSB0b1JHQigiZ3JheTk1IiksDQogICAgICAgICBzdWJ1bml0Y29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICAgICBjb3VudHJ5Y29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICAgICBjb3VudHJ5d2lkdGggPSAwLjUsDQogICAgICAgICBzdWJ1bml0d2lkdGggPSAwLjUNCiAgICAgICApDQojIyMNCmdzLm1hcCA8LSBwbG90X2dlbyhycy5ncywgbGF0ID0gfnljb29yZCwgbG9uID0gfnhjb29yZCkgJT4lIA0KICBhZGRfbWFya2Vycyh0ZXh0ID0gfnBhc3RlKHBhc3RlKCJTdGF0ZToiLCBTVEFURSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJDb3VudHk6IiwgY291bnR5KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIkFkZHJlc3M6IiwgQUREUkVTUyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJaaXAgQ29kZToiLCBaSVBuZXcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiPGJyPiIpLA0KICAgICAgICAgICAgICBjb2xvciA9IH5kZXNjcmlwdGlvbiwgDQogICAgICAgICAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLCANCiAgICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiKSAgICU+JSANCiAgI2NvbG9yYmFyKHRpdGxlID0gIkluY29taW5nIGZsaWdodHM8YnI+MjAxMS4yIikgICU+JSANCiAgbGF5b3V0KCB0aXRsZSA9ICdHYXMgU3RhdGlvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMnLCANCiAgICAgICAgICBnZW8gPSBnKQ0KZ3MubWFwDQpgYGANCg0KQSBwbG90bHkgaW50ZXJhY3RpdmUgc2NhdHRlciBtYXAgd2FzIGNyZWF0ZWQgdG8gcGxvdCBsb2NhdGlvbnMgb2Ygc2FtcGxlZCBnYXMgc3RhdGlvbnMgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLiBJdCBzZWVtcyB0aGF0IGEgZ3JlYXQgbnVtYmVyIG9mIHRoZSBnYXMgc3RhdGlvbnMgaW4gdGhlIHNhbXBsZSBhbmQgb3ZlcmFsbCBwb3B1bGF0aW9uIGNvbWUgZnJvbSBlYXN0ZXJuIFRleGFzLCB0aGUgY29hc3RzIG9mIENhbGlmb3JuaWEsIGFuZCBGbG9yaWRhLiBNb3JlIGdhcyBzdGF0aW9ucyBzYW1wbGVkIGFjcm9zcyB0aGUgVS5TLiBhcmUgaW4gdGhlIGVhc3Rlcm4gaGFsZiBvZiB0aGUgY291bnRyeSBjb21wYXJlZCB0byB0aGUgd2VzdGVybiBoYWxmLiBJdCBzaG91bGQgYWxzbyBiZSBzYWlkIHRoYXQgdGhlIFUuUy4gc3RhdGVzIGluIHRoZSBmYXIgbm9ydGhlcm4gYW5kIG1pZC13ZXN0ZXJuIChVdGFoLCBOZWJyYXNrYSwgQ29sb3JhZG8sIFd5b21pbmcpIHJlZ2lvbnMgb2YgdGhlIGNvdW50cnkgaGF2ZSBmZXcgdG8gbm8gZ2FzIHN0YXRpb25zIHRoYXQgd2VyZSBzYW1wbGVkLiBUaGlzIG1heSBpbXBseSB0aGVyZSBhcmUgbm90IGFzIG1hbnkgZ2FzIHN0YXRpb25zIGluIHRoZSBub3J0aGVybiBhbmQgbWlkLXdlc3Rlcm4gc3RhdGVzIGFzIGluIG90aGVyIHN0YXRlcy4gVGhpcyBjb3VsZCBiZSBiZWNhdXNlIGh1bWFuIHBvcHVsYXRpb24gc2l6ZXMgaW4gdGhvc2Ugc3RhdGVzIGFyZSBzbWFsbGVyIGNvbXBhcmVkIHRvIHN0YXRlcyB3aXRoIG1vcmUgZ2FzIHN0YXRpb25zLiBUaGUgbnVtYmVyIG9mIGdhcyBzdGF0aW9ucyBpbiBhIHN0YXRlIGNvdWQgYmUgcHJvcG9ydGlvbmFsIHRvIHBvcHVsYXRpb24gc2l6ZSBvZiB0aGF0IHN0YXRlLiBBcyBwb3B1bGF0aW9uIHNpemUgaW5jcmVhc2VzIGluIGEgc3RhdGUsIHNvIGRvIHRoZSBudW1iZXIgb2YgZ2FzIHN0YXRpb25zLiBHYXMgc3RhdGlvbnMgc2FtcGxlZCBhbG9uZyB0aGUgd2VzdGVybiBhbmQgdXBwZXIgZWFzdGVybiBjb2FzdHMgb2YgdGhlIFUuUy4gdGVuZGVkIHRvIGFsbCBiZSBmcm9tIHVyYmFuIHNldHRpbmdzLiBUaGUgZmV3IGdhcyBzdGF0aW9ucyBzYW1wbGVkIGluIHRoZSBub3J0aGVybiBzdGF0ZXMgYXBwZWFyIHRvIGJlIGluIHJ1cmFsIHNldHRpbmdzLg0KDQoNCiMgUGhpbGx5IDIwMjMgQ3JpbWUgRGF0YSBJbnRlcmFjdGl2ZSBNYXANCg0KYGBge3J9DQpQaGlsbHlDcmltZSA8LSByZWFkLmNzdihmaWxlID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemhlbmVnaGFuL2FoZW5lZ2hhbi9tYWluL2RhdGFzZXRzL1BoaWxseUNyaW1lU2luY2UyMDE1LmNzdiIpDQpQaGlsbHlDcmltZSRkYXRlIDwtIGFzLlBPU0lYY3QoUGhpbGx5Q3JpbWUkZGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZICVIOiVNIikNClBoaWxseUNyaW1lJHllYXIgPC0gZm9ybWF0KFBoaWxseUNyaW1lJGRhdGUsIGZvcm1hdD0iJVkiKQ0KY3JpbWUuMjAyMyA8LSBQaGlsbHlDcmltZSAlPiUNCiAgZmlsdGVyKHllYXIgPT0gIjIwMjMiKQ0KY3JpbWUuMjAyMyA8LSBuYS5vbWl0KGNyaW1lLjIwMjMpDQojIyMNCnRpdGxlIDwtIHRhZ3MkZGl2KA0KICBIVE1MKCc8Zm9udCBjb2xvciA9ICJjaG9jb2xhdGUiIHNpemUgPTQ+PGI+UGhpbGFkZWxwaGlhIENyaW1lIENhc2UgTG9jYXRpb25zIDIwMjM8L2I+PC9mb250PicpDQogICkNCkFubm90YXRlV3JhcHBlciA8LSB0YWdzJGRpdigNCiAgIEhUTUwoJzxjZW50ZXI+PGltZyBib3JkZXI9IjAiIGFsdD0iSW1hZ2VUaXRsZSIgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXpoZW5lZ2hhbi9haGVuZWdoYW4vbWFpbi9pbWFnZXMvcGhpbGFkZWxwaGlhLnBuZyIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxMDAiPjxjZW50ZXI+DQogICAgPGZvbnQgY29sb3IgPSAiZGFya2dyZWVuIj4yMDIzPC9mb250PicpDQogKQ0KZmF0YWxDb2xvciA8LSByZXAoIiNEQzI2N0YiKQ0KZmF0YWxDb2xvclt3aGljaChjcmltZS4yMDIzJGZhdGFsPT0iTm9uZmF0YWwiKV0gPC0gIiM2NDhGRkYiDQpmYXRhbENvbG9yW3doaWNoKGNyaW1lLjIwMjMkZmF0YWw9PSJGYXRhbCIpXSA8LSAiI0RDMjY3RiINCiMjDQpsYWJlbC5tc2cgPC0gcGFzdGUocGFzdGUoIlN0cmVldDoiLCBjcmltZS4yMDIzJHN0cmVldF9uYW1lKSwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZSgiPGJyPiBaSVAgQ29kZToiLCBjcmltZS4yMDIzJHppcF9jb2RlKSwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZSgiPGJyPiBOZWlnaGJvcmhvb2Q6IiwgY3JpbWUuMjAyMyRuZWlnaGJvcmhvb2QpLA0KICAgICAgICAgICAgICAgICAgIHBhc3RlKCI8YnI+IExvbmdpdHVkZToiLCBjcmltZS4yMDIzJGxuZyksDQogICAgICAgICAgICAgICAgICAgcGFzdGUoIjxicj4gTGF0aXR1ZGU6IiwgY3JpbWUuMjAyMyRsYXQpKQ0KIyMNCmxlYWZsZXQoY3JpbWUuMjAyMykgJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBzZXRWaWV3KGxuZz1tZWFuKGNyaW1lLjIwMjMkbG5nKSwgbGF0PW1lYW4oY3JpbWUuMjAyMyRsYXQpLCB6b29tID0gMTMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLldvcmxkR3JheUNhbnZhcykgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgICAgICAgICB+bG5nLCANCiAgICAgICAgICAgIH5sYXQsDQogICAgICAgICAgICBjb2xvciA9IGZhdGFsQ29sb3IsDQogICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwgDQogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNCwNCiAgICAgICAgICAgIHBvcHVwID0gfmxhYmVsLm1zZywNCiAgICAgICAgICAgIGxhYmVsID0gfnBhc3RlKCJTdHJlZXQ6IiwgY3JpbWUuMjAyMyRzdHJlZXRfbmFtZSkpICAlPiUNCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICBjb2xvcnMgPSBjKCIjREMyNjdGIiwgIiM2NDhGRkYiKSwNCiAgICAgICAgICAgIGxhYmVscz0gYygiRmF0YWwiLCAiTm9uLUZhdGFsIiksDQogICAgICAgICAgICB0aXRsZT0gIkNyaW1lIFN0YXR1cyIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMC40KSAlPiUNCiAgYWRkQ29udHJvbCh0aXRsZSwgcG9zaXRpb24gPSAidG9wcmlnaHQiKSAlPiUNCiAgYWRkQ29udHJvbChBbm5vdGF0ZVdyYXBwZXIsIHBvc2l0aW9uID0gImJvdHRvbWxlZnQiKQ0KYGBgDQoNCkFuIGludGVyYWN0aXZlIGxlYWZsZXQgbWFwIHdhcyBjcmVhdGVkIHRvIHBsb3QgbG9jYXRpb25zIG9mIGNyaW1lcyB0aGF0IHRvb2sgcGxhY2UgaW4gUGhpbGFkZWxwaGlhLCBQQSBpbiAyMDIzLiBDcmltZXMgd2VyZSBtYXJrZWQgd2l0aCBkaWZmZXJlbnQgY29sb3JzIHRvIHJlcHJlc2VudCBjcmltZXMgdGhhdCB3ZXJlIGZhdGFsIGFuZCBjcmltZXMgdGhhdCB3ZXJlbid0LiBPdGhlciByZWxldmFudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjcmltZSBpbiAyMDIzLCBzdWNoIGFzIHRoZSBzdHJlZXQgYW5kIG5laWdoYm9yaG9vZCB3aGVyZSB0aGV5IHdlcmUsIGlzIGluY2x1ZGVkIGluIGEgcG9wdXAgKGNsaWNrIGVhY2ggcG9pbnQpLg0KDQpNb3N0IG9mIHRoZSBwb2ludHMgdGhlbXNlbHZlcyBhcHBlYXIgdG8gYmUgbWFpbmx5IGluIHR3byBsYXJnZSBjbHVzdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgcml2ZXIgd2hpbGUgdGhlIG90aGVycyBhcmUgbG93ZXIgZG93biB0aGUgcml2ZXIgb3IgZXZlbiBtb3JlIHJpZ2h0IG9mIHRoZSBjbHVzdGVyIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSByaXZlci4gVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHRvbyBtdWNoIHZhcmlhdGlvbiBvciBhbnkgb2J2aW91cyBwYXR0ZXJucyBpbiBzcHJlYWQgb2YgZmF0YWwgYW5kIG5vbi1mYXRhbCBjcmltZXMgYWNyb3NzIFBoaWxhZGVscGhpYSBpbiAyMDIzLiBNb3N0IG9mIHRoZSBmYXRhbCBhbmQgbm9uLWZhdGFsIGNyaW1lIGxvY2F0aW9ucyBzZWVtIHRvIGJlIHJlbGF0aXZlbHkgY2xvc2UgdG8gb25lIGFub3RoZXIuIFNvbWUgcG9pbnRzLCB3aGV0aGVyIGZhdGFsIG9yIG5vbi1mYXRhbCwgdGVuZCB0byBvdmVybGFwIHNpbmNlIHNvbWUgY3JpbWVzIGhhdmUgbW9yZSB0aGFuIG9uZSB2aWN0aW0gb3IgY3JpbWluYWwuIE5vbi1mYXRhbCBjcmltZXMgc2VlbSB0byBiZSBtb3JlIGZyZXF1ZW50IGNvbXBhcmVkIHRvIGZhdGFsIGNyaW1lcywgYW5kIG9ubHkgYSBmZXcgbm9uLWZhdGFsIGNyaW1lcyB0ZW5kIHRvIHN0cmV0Y2ggb3V0IHBhc3QgdGhlIGFmb3JlbWVudGlvbmVkIGNsdXN0ZXJzLg0K